{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.array([\n",
    "    [5, 1], \n",
    "    [4, 2], \n",
    "    [2, 5], \n",
    "    [1, 4], \n",
    "    [3, 2], \n",
    "    [2, 5]\n",
    "]) \n",
    "# 0表示动作片，1表示喜剧片\n",
    "y = np.array([0, 0, 1, 1, 0, 1])  \n",
    "\n",
    "# 定义电影类型标签\n",
    "movie_types = {0: \"动作片\", 1: \"喜剧片\"}"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建K近邻分类器模型，设置最近邻的数量为1\n",
    "knn = KNeighborsClassifier(n_neighbors=1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y) # 使用样本数据和对应的标签训练模型"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型推测新用户喜好的电影类型是 喜剧片\n"
     ]
    }
   ],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)\n",
    "# 获取预测的电影类型\n",
    "predicted_movie_type = movie_types[prediction[0]]\n",
    "print(\"模型推测新用户喜好的电影类型是\", predicted_movie_type)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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EVkSvS/XT0tLM0IYRERERKand2HUqFEjdO7cGV9//TVu3LhhjJiIiIiITELvwig5ORnBwcF477334OXlhfDwcHz//fdQKBTGiI+IiIio2uhdGLVt2xYff/wx0tPT8csvv8Dd3R0vv/wy3N3defk+ERERmTW9C6MSkiShR48eWLZsGX777Tc0atQIq1atMmRsRERERNXqoQujixcv4qOPPkKbNm3Qvn171KpVC1988YUhYyMiIiKqVnrf+fqbb77B2rVrsW/fPjRr1gwRERHYvHkz/Pz8jBAeERERUfXRuzCaP38+hg0bhs8++wxt2rQxQkhEREREpqF3YZSeng5JkowRCxEREZFJ6V0YSZKEW7duISYmBidPnoQkSWjevDnGjBmD2rVrGyNGIiIiomrxUPcxaty4MRYvXowbN27g2rVrWLx4MRo3boyUlBRjxEhERERULfQ+YjR16lT0798fy5Ytg0xWvHpBQQHGjh2L119/Hbt37zZ4kERERETVQe/CKDk5WaMoAgCZTIYZM2YgKCjIoMERERERVSe9T6U5OzsjPT1dq/3ixYtwcnIySFBEREREpqB3YTR06FCMGTMGGzZswMWLF3Hp0iWsX78eY8eOxfDhw40RIxEREVG10LswWrRoEQYNGoSXXnoJfn5+8PX1xciRIzFkyBB8+OGHem1r4cKFaN++PZycnODu7o4BAwbg9OnT5a6TmJgISZK0XqdOndI3FSIiIiINes8xsrW1xWeffYaFCxfi7NmzEEKgSZMmcHBw0HvnSUlJmDhxItq3b4+CggL83//9H0JDQ3HixAnUqlWr3HVPnz4NZ2dn9ft69erpvX8iIiKi0vQujEo4ODigVatWVdr59u3bNd6vXLkS7u7uOHLkCLp27Vruuu7u7qhTp06V9k9ERERUWqULo9GjR1eq34oVKx46mNu3bwMA6tatW2HfwMBA5OXloUWLFpg9ezZ69Oihs59CoYBCoVC/z8nJAQAolUoolcqHjlWXku0Zers1haXnB1h+jszP/Fl6jszP/Bkrx+r6zCQhhKhMRysrK/j6+iIwMBDlrbJp06aHCkQIgfDwcNy8eRN79uwps9/p06exe/dutGvXDgqFAt9++y2io6ORmJio8yjT3LlzMW/ePK32uLi4hzr9R0RERNUvNzcXI0aMwO3btzWm0hhapQujV199FevXr0eD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b65uGzFiBI4dO4YjR47ghx9+QERERJn7bNu2Lc6cOQN3d3c0adJE41W7dm2d66xduxbe3t74888/cfToUfUrKioKq1atQkFBgV5579mzB5MnT0ZYWBhatmwJuVyOa9euafSxsbFBYWGhXtt9kL+/PwoKCpCamqpu+/fff3Hr1q0qbZeIqoaFERHpZG1tjZMnT+LkyZMap4NK1KpVC6+88grefPNNbN++HSdOnMC4ceOQm5uLMWPGqPs1bNgQTz31FMaMGYOCggKEh4eXuc+IiAi4ubkhPDwce/bswfnz55GUlIQpU6bg0qVLOteJiYnBkCFD8MQTT2i8Ro8ejVu3bmHr1q165d2kSRN8++23OHnyJP744w9ERETA3t5eo4+fnx927tyJy5cv4+bNm3ptv4S/vz969eqF8ePH49ChQ0hNTcX48eN1HsUiourDwoiIyuTs7AxnZ+cyl3/wwQcYPHgwXnzxRbRt2xb//vsvfv31V615MhEREfjzzz8xaNAgrSKjNAcHB+zevRsNGjTAoEGD0Lx5c4wePRr379/XGceRI0fw559/YvDgwVrLnJycEBoaqvc9jVasWIGbN28iMDAQL774ovp2BKV98sknSEhI0HkLA32sXr0ajz32GLp27YqBAwdi3LhxcHJygp2d3UNvk4iqRhI8oU1EVCNcunQJPj4++O2339CzZ09Th0P0SGJhRERkIr///jvu3r2LVq1aISsrCzNmzEBGRgb++ecfrYnbRFQ9eFUaEZGJKJVKzJo1C+fOnYOTkxOeeuoprF27lkURkQnxiBERERGRCidfExEREamwMCIiIiJSYWFEREREpMLCiIiIiEiFhRERERGRCgsjIiIiIhUWRkREREQqLIyIiIiIVFgYEREREan8Pwwl+5DMFtBcAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "colors = ['yellow' if label == 1 else 'purple' for label in y]\n",
    "plt.scatter(X[:, 0], X[:, 1], c=colors, label=['Action' if label == 0 else 'Comedy' for label in y])\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], 'rx', markersize=8)\n",
    "\n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest = X[idx[0, 0]]  # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "plt.plot([new_user[0, 0], nearest[0]], [new_user[0, 1], nearest[1]], 'r--')\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
